﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Text;
using System.Drawing;
using log4net;
using System.Configuration;
using System.Globalization;
using GS1.Utilitario;
using GS1.Entidad;
using System.Windows.Forms;
using GS1.Datos;
using GS1.Negocio;
using ThingMagic;


namespace MantenimientoEtiquetasRFID.Formularios
{
    public partial class frmPrincipal : Form
    {
        #region --- Variables y Propiedades ---

        private static readonly ILog log = LogManager.GetLogger(typeof(frmPrincipal));

        // Create a collection to hold all the ImpinjReader instances.
       // private Reader reader = null;
       // private Status status = null;
        private ListaMenuHTB listaMostrar = null;
        private Login login = null;

        private RFIDState estadoReader;
        private enum RFIDState
        {
            CONECTADO,
            DESCONECTADO
        }

        // Cabecera de identificacion de etiqueta
        //private string IDENTIFICADOR_CAB_ETIQUETA = "0000";

        private const string PRINCIPAL_MODULO = "CONTROL VEHÍCULO";
        private const string PRINCIPAL_SISTEMA = "Sistema de Mantenimiento";
        private const string PRINCIPAL_SISTEMA2 = "de Etiquetas RFID";
        private const string PRINCIPAL_VERSION = "Versión 1.00.00";
        #endregion

        #region --- Constructor ---
        public frmPrincipal()
        {
            InitializeComponent();
        }
        #endregion

        #region ---Eventos propios ---
        
        private void frmPrincipal_Load(object sender, EventArgs e)
        {
            cargarFormulario();
        }
        #endregion
        
        private void cargarFormulario()
        {

            using (frmLogin login = new frmLogin())
            {
                if (login.ShowDialog() == DialogResult.Cancel)
                {
                    Environment.Exit(0);
                }
                else
                {
                    ParametrosAplicacion.USUARIO_ACTUAL = login.UsuarioSesion;
                    this.login = login.UsuarioSesion;
                    // Estableciendo los datos de pantalla principal 
                    this.lblNombreModulo.Text = Convert.ToString(ConfigurationManager.AppSettings[PRINCIPAL_MODULO]);
                    this.lblNombreSistema.Text = PRINCIPAL_SISTEMA;
                    this.lblNombreSistemab.Text = PRINCIPAL_SISTEMA2;
                    this.lblVersion.Text = PRINCIPAL_VERSION;

                    this.login = obtenerMenu(this.login);

                    if (this.login == null)
                    {
                        Libreria.ShowMessageboxError(Constantes.MENS_ERROR);
                    }

                    ParametrosAplicacion.USUARIO_ACTUAL.codPerfil = this.login.codPerfil;

                    cargarMenu();

                }
            }
            
        }

        private Login obtenerMenu(Login usuarioLogeado)
        {
          
            try
            {
               this.login =  new LoginBL().obtenerMenu(this.login);
            }

            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }

            return this.login;
        }

        private void cargarMenu()
        {
           try
            {
               MenuStrip ms = new MenuStrip();

                string[] row = new string[] { "Mov.Diario", "Consultas", "Reportes", "Tablas", "Utilitarios", "Salir" };

                foreach (string rw in row)
                {
                    ToolStripMenuItem windowMenu = new ToolStripMenuItem(rw, null, new EventHandler(windowNewMenu_Click2));
                    ms.Items.Add(windowMenu);

                    if (rw == "Mov.Diario")
                    {
                        foreach (MenuHTB menu in this.login.listaMenuHTB.lista)
                        {
                            ToolStripMenuItem windowNewMenu = new ToolStripMenuItem(menu.desOpcion, null, new EventHandler(windowNewMenu_Click1));
                            windowMenu.DropDownItems.Add(windowNewMenu);
                        }
                    }
                }

                // The Form.MainMenuStrip property determines the merge target. 
                this.MainMenuStrip = ms;

                this.Controls.Add(ms);                
            }

            catch (Exception ex)
            {
                Libreria.MensajeError(ex);
            }

        }

        void windowNewMenu_Click2(object sender, EventArgs e)
        {
            string menu = sender.ToString();

            if (menu.Equals("Salir"))
            {
                Environment.Exit(0);

            }

        }

        public void windowNewMenu_Click1(object sender, System.EventArgs e)
        {
            string submenu = sender.ToString();

            if (submenu.Equals(ConfigurationManager.AppSettings[Constantes.GENE_ETIQ].ToString()))
                {
                    using (frmNuevo frmNuevo = new frmNuevo())
                    {

                        frmNuevo.ShowDialog();
                    }
                 
                }

            if (submenu.Equals(ConfigurationManager.AppSettings[Constantes.MODI_ETIQ].ToString()))
                {
                    using (frmModificar frmModificar = new frmModificar())
                    {
                        frmModificar.ShowDialog();
                    }

                }
         }

         private string obtenerInformacion()
         {
                StringBuilder cadenaInformacion = null;
                try
                {
                    if (this.estadoReader == RFIDState.DESCONECTADO)
                    {
                        log.Debug("Primero debe establecer conexion con el Reader");
                        return string.Empty;
                    }


                    log.Debug(cadenaInformacion.ToString());
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                }

                return cadenaInformacion.ToString();
            }

            private bool obtenerEstadoConexion()
            {
                bool conectado = false;
                try
                {
                    // Status status = this.reader.QueryStatus();
                    // conectado = status.IsConnected == true;
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                }

                return conectado;
            }

            private bool iniciarLectura()
            {
                bool resultado = false;
                try
                {
                    if (this.estadoReader == RFIDState.DESCONECTADO) { return resultado; }

                    /* if (!this.reader.QueryStatus().IsSingulating)
                     {
                         this.reader.Start();
                     }*/

                    resultado = true;
                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                }

                return resultado;
            }

            private bool detenerLectura()
            {
                bool resultado = false;
                try
                {
                    if (this.estadoReader == RFIDState.DESCONECTADO)
                    {
                        log.Debug("Primero debe establecer conexion con el Reader");
                        return resultado;
                    }

                    /* if (this.reader.QueryStatus().IsSingulating)
                     {
                         this.reader.Stop();
                     }*/

                    resultado = true;

                }
                catch (Exception ex)
                {
                    log.Error(ex.Message, ex);
                }

                return resultado;
            }
            
            }
}
